home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DTP / DTP_TEX / H220.ZIP / WP2LATEX.ZIP / WP2LATEX.PAS < prev    next >
Pascal/Delphi Source File  |  1990-03-06  |  52KB  |  1,977 lines

  1. Program WordPerfect_to_LaTeX;
  2.  
  3. {           Version 1.0
  4.             Date 27-1-1990
  5. }
  6.  
  7. {$R+}       { Range check error }
  8.  
  9. Uses Crt;   { Clearscreen }
  10.  
  11. Type  Bin = file of byte;
  12.  
  13. Var
  14.    wpd_fn,
  15.    strip_fn,
  16.    tabel_fn,
  17.    latex_fn  : String;
  18.  
  19.    wpd,
  20.    tabel : Bin;
  21.    strip,
  22.    latex : Text;
  23.  
  24.    num_of_lines_stripfile : Word;
  25.  
  26.    open_com,
  27.    close_com : Array [$0..$10] of String;
  28.  
  29.    Exitsave : pointer;
  30.  
  31.  
  32. Procedure Rd_word(Var f:Bin; Var w:Word);
  33. { Deze procedure leest een woord uit de opgegeven binaire file. }
  34.  
  35. Var
  36.    b : Byte;
  37.  
  38. Begin
  39.    Read(f,b);
  40.    w:=b;
  41.    Read(f,b);
  42.    w:=w+256*b
  43. End;
  44.  
  45.  
  46. Procedure Wr_word(Var f:Bin; w:Word);
  47. { Deze procedure schrijft een woord in de opgegeven binaire file. }
  48.  
  49. Var
  50.    b : Byte;
  51.  
  52. Begin
  53.    b:=w mod 256;
  54.    Write(f,b);
  55.    b:=w div 256;
  56.    Write(f,b);
  57. End;
  58.  
  59.  
  60. Procedure Jump_in_file(Var f:Bin; dis:Longint);
  61. { Deze procedure springt in een binaire file het aantal opgegeven bytes. }
  62.  
  63. Var
  64.    cur_pos : Longint;
  65.  
  66. Begin
  67.    cur_pos := Filepos(f);
  68.    Seek(f,cur_pos+dis);
  69. End;
  70.  
  71.  
  72.  
  73. Procedure Wpd_check;
  74. { Kontroleert of de opgegeven WP-document wel daadwerkelijk een   }
  75. { WP5.0-document is.                                              }
  76.  
  77. Var id1,id2,std1,std2,filetype,dmp1,dmp2,dmp3 : Word;
  78.     Startdoc, Pointer : Longint;
  79.     b:Byte;
  80.  
  81. Begin
  82.    Rd_word(wpd,id1); Rd_word(wpd,id2);
  83.    Rd_word(wpd,std1); Rd_word(wpd,std2);
  84.    Rd_word(wpd,filetype);
  85.    Rd_word(wpd,dmp1); Rd_word(wpd,dmp2); Rd_word(wpd,dmp3);
  86.  
  87.    Startdoc:=std2*65536+std1;
  88.  
  89.    If (id1=$57ff) and (id2=$4350) and
  90.       (filetype=$0A01)  {and (dmp1=$0) and (dmp2=$0) and (dmp3=$0)}
  91.  
  92.    Then Seek(wpd,startdoc)    { Het is een WP5.0-document}
  93.    Else RunError($0201)       { Het is geen WP5.0-document}
  94. End;
  95.  
  96.  
  97.  
  98.  
  99. Procedure Filenames;
  100. { Deze procedure handelt het opgeven van de filenamen af. }
  101.  
  102. Var
  103.    name,
  104.    invoer,
  105.    wpdef,
  106.    latdef,
  107.    filename,
  108.    ext           : String;
  109.    l,p           : Integer;
  110.  
  111. Begin
  112.    If ParamCount<1
  113.    Then wpdef:=''
  114.    Else wpdef:=Paramstr(1);
  115.  
  116.    Writeln;
  117.    Writeln;
  118.    Write('WordPerfect-filename [',wpdef,'] : ');
  119.    Readln(invoer);
  120.    If invoer=''
  121.    Then wpd_fn:=wpdef
  122.    Else wpd_fn:=invoer;
  123.  
  124.    If wpd_fn=''                 { No filename entered }
  125.    Then RunError($200);
  126.  
  127.    name:=wpd_fn;
  128.    l:=Length(name);
  129.    p:=Pos('.',name);
  130.    if p=0 then p:=l+1;
  131.    filename:=copy(name,1,p-1);
  132.  
  133.    strip_fn:=concat(filename,'.STR');
  134.    tabel_fn:=concat(filename,'.TBL');
  135.    latdef:=concat(filename,'.TEX');
  136.  
  137.    Write('LaTeX-filename [',latdef,'] : ');
  138.    Readln(invoer);
  139.    Writeln;
  140.    If invoer=''
  141.    Then latex_fn:=latdef
  142.    Else latex_fn:=invoer;
  143.  
  144.    Assign(wpd,wpd_fn);
  145.    Assign(strip,strip_fn);
  146.    Assign(tabel,tabel_fn);
  147.    Assign(latex,latex_fn);
  148.  
  149. End;
  150.  
  151.  
  152. {$F+}
  153. Procedure Einde_prog;
  154. { Deze procedure wordt aan het einde van het programma aangeroepen. }
  155. { Er wordt gekeken of er zich Run-Time error heeft voor gedaan.     }
  156.  
  157. Var
  158.    save_ErrorAddr : Pointer;
  159.  
  160. Begin
  161.    Writeln;
  162.  
  163.    ExitProc:=Exitsave;
  164.    save_ErrorAddr := ErrorAddr;
  165.    ErrorAddr := nil;
  166.  
  167.    If save_ErrorAddr <> nil
  168.    Then Case Exitcode of
  169.                $0002 : Writeln('File not found.');
  170.                $0003 : Writeln('Path not found.');
  171.                $0100 : Writeln('Program Error.');
  172.                $0200 : Writeln('No filename entered !');
  173.                $0201 : Writeln('Not a WordPerfect 5.0 document !');
  174.  
  175.              Else ErrorAddr := save_ErrorAddr;
  176.         End
  177.  
  178.    Else Begin
  179.            Writeln('Conversion completed.');
  180.            Writeln;
  181.         End;
  182.  
  183.    Writeln;
  184. End;
  185. {$F-}
  186.  
  187.  
  188. Procedure Init_commando;
  189. Begin
  190.    Open_com[$0]:='{\LARGE ';
  191.    Open_com[$1]:='{\Large ';
  192.    Open_com[$2]:='{\large ';
  193.    Open_com[$3]:='{\small ';
  194.    Open_com[$4]:='{\footnotesize ';
  195.    Open_com[$5]:='$^{\rm ';
  196.    Open_com[$6]:='$_{\rm ';
  197.    Open_com[$7]:='';
  198.    Open_com[$8]:='{\it ';
  199.    Open_com[$9]:='';
  200.    Open_com[$A]:='';
  201.    Open_com[$B]:='\underline{\Underline{';
  202.    Open_com[$C]:='{\bf ';
  203.    Open_com[$D]:='';
  204.    Open_com[$E]:='\Underline{';
  205.    Open_com[$F]:='{\sc ';
  206.  
  207.    Close_com[$0]:='}';
  208.    Close_com[$1]:='}';
  209.    Close_com[$2]:='}';
  210.    Close_com[$3]:='}';
  211.    Close_com[$4]:='}';
  212.    Close_com[$5]:='}$';
  213.    Close_com[$6]:='}$';
  214.    Close_com[$7]:='';
  215.    Close_com[$8]:='\/}';
  216.    Close_com[$9]:='';
  217.    Close_com[$A]:='';
  218.    Close_com[$B]:='}}';
  219.    Close_com[$C]:='}';
  220.    Close_com[$D]:='';
  221.    Close_com[$E]:='}';
  222.    Close_com[$F]:='}';
  223. End;
  224.  
  225.  
  226. {---SLAG1----}
  227.  
  228. Procedure Convert_first_strike;
  229. { Dit is de komplete procedure van de eerste slag met zijn eigen proc.'s. }
  230.  
  231. Var
  232.    by  : Byte;
  233.    wo,
  234.    regelnum  : Word;
  235.  
  236.    convperc,
  237.    i     : Integer;
  238.  
  239.    srtdocpos,
  240.    fsize,
  241.    fpos,
  242.    nextdocpos : longint;
  243.  
  244.    lat    : Array[$20..$7F] of String[25];
  245.    char_set  : Array[$80..$FE] of Integer;
  246.    char_code : Array[$80..$FE] of Integer;
  247.    ext_lat   : Array[$80..$FE] of String[25];
  248.  
  249.  
  250.    leegptr,
  251.    openptr               : Array [0..1] of Integer;
  252.    attr_rij              : Array [0..1,0..16] of Byte;
  253.    open_attr_rij         : Array [0..1] of Boolean;
  254.    depth                 : Integer;
  255.  
  256.    envir,
  257.    line_term      : Char;
  258.  
  259.    char_on_line,
  260.    nomore_valid_tabs,
  261.    indenting,
  262.    indent_end,
  263.    ind_text1,
  264.    ind_text2  : Boolean;
  265.  
  266.    ind_leftmargin,
  267.    ind_rightmargin : Word;
  268.  
  269.    num_of_tabs,
  270.    latex_tabpos : Integer;
  271.    tabpos       : Array [1..40] of Word;
  272.    right_tab,
  273.    align_tab,
  274.    center_tab   : Boolean;
  275.  
  276.    WP_sidemargin  : Integer;
  277.  
  278.  
  279.  
  280.  
  281. Procedure WP_Default;
  282. Var
  283.    j : Integer;
  284.  
  285. Begin
  286.    WP_sidemargin := 1200;
  287.  
  288.    tabpos[1]:=$02c5;                      { 1e WP-tab is kantlijn --> }
  289.    For j:=2 to 10
  290.    Do tabpos[j]:=tabpos[j-1]+$02c5;       { Volgende tabs 1,5  cm     }
  291.    For j:=11 to 40                        { ($02c5 wpu) verder        }
  292.    Do tabpos[j]:=$FFFF;
  293.  
  294.    num_of_tabs:=10;
  295. End;
  296.  
  297.  
  298. Procedure Table_Init;
  299. Begin
  300.    lat[$20]:=' ';                        {Space}
  301.    lat[$21]:='!';                        {!}
  302.    lat[$22]:='"';                        {"}
  303.    lat[$23]:='\#';                       {#}
  304.    lat[$24]:='\$';                       {dollar}
  305.    lat[$25]:='\%';                       {%}
  306.    lat[$26]:='\&';                       {&}
  307.    lat[$27]:='''';                        {'}
  308.    lat[$28]:='(';                        {(}
  309.    lat[$29]:=')';                        {)}
  310.    lat[$2A]:='*';                        {*}
  311.    lat[$2B]:='+';                        {+}
  312.    lat[$2C]:=',';                        {,}
  313.    lat[$2D]:='-';                        {-}
  314.    lat[$2E]:='.';                        {.}
  315.    lat[$2F]:='/';                        {/}
  316.    lat[$30]:='0';                        {0}
  317.    lat[$31]:='1';                        {1}
  318.    lat[$32]:='2';                        {2}
  319.    lat[$33]:='3';                        {3}
  320.    lat[$34]:='4';                        {4}
  321.    lat[$35]:='5';                        {5}
  322.    lat[$36]:='6';                        {6}
  323.    lat[$37]:='7';                        {7}
  324.    lat[$38]:='8';                        {8}
  325.    lat[$39]:='9';                        {9}
  326.    lat[$3A]:=':';                        {:}
  327.    lat[$3B]:=';';                        {;}
  328.    lat[$3C]:='$<$';                      {<}
  329.    lat[$3D]:='=';                        {=}
  330.    lat[$3E]:='$>$';                      {>}
  331.    lat[$3F]:='?';                        {?}
  332.    lat[$40]:='@';                        {@}
  333.    lat[$41]:='A';                        {A}
  334.    lat[$42]:='B';                        {B}
  335.    lat[$43]:='C';                        {C}
  336.    lat[$44]:='D';                        {D}
  337.    lat[$45]:='E';                        {E}
  338.    lat[$46]:='F';                        {F}
  339.    lat[$47]:='G';                        {G}
  340.    lat[$48]:='H';                        {H}
  341.    lat[$49]:='I';                        {I}
  342.    lat[$4A]:='J';                        {J}
  343.    lat[$4B]:='K';                        {K}
  344.    lat[$4C]:='L';                        {L}
  345.    lat[$4D]:='M';                        {M}
  346.    lat[$4E]:='N';                        {N}
  347.    lat[$4F]:='O';                        {O}
  348.    lat[$50]:='P';                        {P}
  349.    lat[$51]:='Q';                        {Q}
  350.    lat[$52]:='R';                        {R}
  351.    lat[$53]:='S';                        {S}
  352.    lat[$54]:='T';                        {T}
  353.    lat[$55]:='U';                        {U}
  354.    lat[$56]:='V';                        {V}
  355.    lat[$57]:='W';                        {W}
  356.    lat[$58]:='X';                        {X}
  357.    lat[$59]:='Y';                        {Y}
  358.    lat[$5A]:='Z';                        {Z}
  359.    lat[$5B]:='[';                        {[}
  360.    lat[$5C]:='$\tt\backslash$';          {\}
  361.    lat[$5D]:=']';                        {]}
  362.    lat[$5E]:='\^{';                      {^}
  363.    lat[$5F]:='\_';                       {_}
  364.    lat[$60]:='`';                        {`}
  365.    lat[$61]:='a';                        {a}
  366.    lat[$62]:='b';                        {b}
  367.    lat[$63]:='c';                        {c}
  368.    lat[$64]:='d';                        {d}
  369.    lat[$65]:='e';                        {e}
  370.    lat[$66]:='f';                        {f}
  371.    lat[$67]:='g';                        {g}
  372.    lat[$68]:='h';                        {h}
  373.    lat[$69]:='i';                        {i}
  374.    lat[$6A]:='j';                        {j}
  375.    lat[$6B]:='k';                        {k}
  376.    lat[$6C]:='l';                        {l}
  377.    lat[$6D]:='m';                        {m}
  378.    lat[$6E]:='n';                        {n}
  379.    lat[$6F]:='o';                        {o}
  380.    lat[$70]:='p';                        {p}
  381.    lat[$71]:='q';                        {q}
  382.    lat[$72]:='r';                        {r}
  383.    lat[$73]:='s';                        {s}
  384.    lat[$74]:='t';                        {t}
  385.    lat[$75]:='u';                        {u}
  386.    lat[$76]:='v';                        {v}
  387.    lat[$77]:='w';                        {w}
  388.    lat[$78]:='x';                        {x}
  389.    lat[$79]:='y';                        {y}
  390.    lat[$7A]:='z';                        {z}
  391.    lat[$7B]:='\{';                       {{}
  392.    lat[$7C]:='$|$';                      {|}
  393.    lat[$7D]:='\}';                       { }
  394.    lat[$7E]:='\tidle{';                  {~}
  395.    lat[$7F]:=' ';                        {Don't exsist}
  396. End;
  397.  
  398.  
  399. Procedure Ext_chr_init;
  400. Begin
  401.    char_set[$80]:=$01;  char_code[$80]:=$26;  ext_lat[$80]:='\c{C}';
  402.    char_set[$81]:=$01;  char_code[$81]:=$47;  ext_lat[$81]:='\"{u}';
  403.    char_set[$82]:=$01;  char_code[$82]:=$29;  ext_lat[$82]:='\''{e}';
  404.    char_set[$83]:=$01;  char_code[$83]:=$1D;  ext_lat[$83]:='\^{a}';
  405.    char_set[$84]:=$01;  char_code[$84]:=$1F;  ext_lat[$84]:='\"{a}';
  406.    char_set[$85]:=$01;  char_code[$85]:=$21;  ext_lat[$85]:='\`{a}';
  407.    char_set[$86]:=$01;  char_code[$86]:=$23;  ext_lat[$86]:='\aa ';
  408.    char_set[$87]:=$01;  char_code[$87]:=$27;  ext_lat[$87]:='\c{c}';
  409.    char_set[$88]:=$01;  char_code[$88]:=$2B;  ext_lat[$88]:='\^{e}';
  410.    char_set[$89]:=$01;  char_code[$89]:=$2D;  ext_lat[$89]:='\"{e}';
  411.    char_set[$8A]:=$01;  char_code[$8A]:=$2F;  ext_lat[$8A]:='\`{e}';
  412.    char_set[$8B]:=$01;  char_code[$8B]:=$35;  ext_lat[$8B]:='\"{\i}';
  413.    char_set[$8C]:=$01;  char_code[$8C]:=$33;  ext_lat[$8C]:='\^{\i}';
  414.    char_set[$8D]:=$01;  char_code[$8D]:=$37;  ext_lat[$8D]:='\`{\i}';
  415.    char_set[$8E]:=$01;  char_code[$8E]:=$1E;  ext_lat[$8E]:='\"{A}';
  416.    char_set[$8F]:=$01;  char_code[$8F]:=$22;  ext_lat[$8F]:='\AA ';
  417.    char_set[$90]:=$01;  char_code[$90]:=$28;  ext_lat[$90]:='\''{E}';
  418.    char_set[$91]:=$01;  char_code[$91]:=$25;  ext_lat[$91]:='\ae ';
  419.    char_set[$92]:=$01;  char_code[$92]:=$24;  ext_lat[$92]:='\AE ';
  420.    char_set[$93]:=$01;  char_code[$93]:=$3D;  ext_lat[$93]:='\^{o}';
  421.    char_set[$94]:=$01;  char_code[$94]:=$3F;  ext_lat[$94]:='\"{o}';
  422.    char_set[$95]:=$01;  char_code[$95]:=$41;  ext_lat[$95]:='\`{o}';
  423.    char_set[$96]:=$01;  char_code[$96]:=$45;  ext_lat[$96]:='\^{u}';
  424.    char_set[$97]:=$01;  char_code[$97]:=$49;  ext_lat[$97]:='\`{u}';
  425.    char_set[$98]:=$01;  char_code[$98]:=$8B;  ext_lat[$98]:='\"{y}';
  426.    char_set[$99]:=$01;  char_code[$99]:=$3E;  ext_lat[$99]:='\"{O}';
  427.    char_set[$9A]:=$01;  char_code[$9A]:=$46;  ext_lat[$9A]:='\"{U}';
  428.    char_set[$9B]:=$04;  char_code[$9B]:=$13;  ext_lat[$9B]:='\ ';
  429.    char_set[$9C]:=$04;  char_code[$9C]:=$0B;  ext_lat[$9C]:='\pounds ';
  430.    char_set[$9D]:=$04;  char_code[$9D]:=$0C;  ext_lat[$9D]:='\ ';
  431.    char_set[$9E]:=$04;  char_code[$9E]:=$0D;  ext_lat[$9E]:='\ ';
  432.    char_set[$9F]:=$04;  char_code[$9F]:=$0E;  ext_lat[$9F]:='{\it f}\/';
  433.    char_set[$A0]:=$01;  char_code[$A0]:=$1B;  ext_lat[$A0]:='\''{a}';
  434.    char_set[$A1]:=$01;  char_code[$A1]:=$31;  ext_lat[$A1]:='\''{\i}';
  435.    char_set[$A2]:=$01;  char_code[$A2]:=$3B;  ext_lat[$A2]:='\''{o}';
  436.    char_set[$A3]:=$01;  char_code[$A3]:=$43;  ext_lat[$A3]:='\''{u}';
  437.    char_set[$A4]:=$01;  char_code[$A4]:=$39;  ext_lat[$A4]:='\~{n}';
  438.    char_set[$A5]:=$01;  char_code[$A5]:=$38;  ext_lat[$A5]:='\~{N}';
  439.    char_set[$A6]:=$04;  char_code[$A6]:=$0F;  ext_lat[$A6]:='\astrike ';
  440.    char_set[$A7]:=$04;  char_code[$A7]:=$10;  ext_lat[$A7]:='\ostrike ';
  441.    char_set[$A8]:=$04;  char_code[$A8]:=$08;  ext_lat[$A8]:='?`';
  442.    char_set[$A9]:=$05;  char_code[$A9]:=$10;  ext_lat[$A9]:='~';
  443.    char_set[$AA]:=$06;  char_code[$AA]:=$14;  ext_lat[$AA]:='~';
  444.    char_set[$AB]:=$04;  char_code[$AB]:=$11;  ext_lat[$AB]:='$\frac{1}{2}$';
  445.    char_set[$AC]:=$04;  char_code[$AC]:=$12;  ext_lat[$AC]:='$\frac{1}{4}$';
  446.    char_set[$AD]:=$04;  char_code[$AD]:=$07;  ext_lat[$AD]:='!`';
  447.    char_set[$AE]:=$04;  char_code[$AE]:=$09;  ext_lat[$AE]:='$\ll$';
  448.    char_set[$AF]:=$04;  char_code[$AF]:=$0A;  ext_lat[$AF]:='$\gg$';
  449.    char_set[$E0]:=$08;  char_code[$E0]:=$01;  ext_lat[$E0]:='$\alpha$';
  450.    char_set[$E1]:=$01;  char_code[$E1]:=$17;  ext_lat[$E1]:='$\beta$';
  451.    char_set[$E2]:=$08;  char_code[$E2]:=$06;  ext_lat[$E2]:='$\Gamma$';
  452.    char_set[$E3]:=$08;  char_code[$E3]:=$21;  ext_lat[$E3]:='$\pi$';
  453.    char_set[$E4]:=$08;  char_code[$E4]:=$24;  ext_lat[$E4]:='$\Sigma$';
  454.    char_set[$E5]:=$08;  char_code[$E5]:=$25;  ext_lat[$E5]:='$\sigma$';
  455.    char_set[$E6]:=$08;  char_code[$E6]:=$19;  ext_lat[$E6]:='$\mu$';
  456.    char_set[$E7]:=$08;  char_code[$E7]:=$29;  ext_lat[$E7]:='$\tau$';
  457.    char_set[$E8]:=$08;  char_code[$E8]:=$2C;  ext_lat[$E8]:='$\Phi$';
  458.    char_set[$E9]:=$08;  char_code[$E9]:=$10;  ext_lat[$E9]:='$\theta$';
  459.    char_set[$EA]:=$08;  char_code[$EA]:=$32;  ext_lat[$EA]:='$\Omega$';
  460.    char_set[$EB]:=$08;  char_code[$EB]:=$09;  ext_lat[$EB]:='$\delta$';
  461.    char_set[$EC]:=$06;  char_code[$EC]:=$13;  ext_lat[$EC]:='$\infty$';
  462.    char_set[$ED]:=$08;  char_code[$ED]:=$2D;  ext_lat[$ED]:='$\emptyset$';
  463.    char_set[$EE]:=$08;  char_code[$EE]:=$0B;  ext_lat[$EE]:='$\epsilon$';
  464.    char_set[$EF]:=$06;  char_code[$EF]:=$10;  ext_lat[$EF]:='$\cap$';
  465.    char_set[$F0]:=$06;  char_code[$F0]:=$0E;  ext_lat[$F0]:='$\equiv$';
  466.    char_set[$F1]:=$06;  char_code[$F1]:=$01;  ext_lat[$F1]:='$\pm$';
  467.    char_set[$F2]:=$06;  char_code[$F2]:=$03;  ext_lat[$F2]:='$\geq$';
  468.    char_set[$F3]:=$06;  char_code[$F3]:=$02;  ext_lat[$F3]:='$\leq$';
  469.    char_set[$F4]:=$07;  char_code[$F4]:=$00;  ext_lat[$F4]:='~';
  470.    char_set[$F5]:=$07;  char_code[$F5]:=$01;  ext_lat[$F5]:='~';
  471.    char_set[$F6]:=$06;  char_code[$F6]:=$08;  ext_lat[$F6]:='$\div$';
  472.    char_set[$F7]:=$06;  char_code[$F7]:=$0D;  ext_lat[$F7]:='$\approx$';
  473.    char_set[$F8]:=$06;  char_code[$F8]:=$24;  ext_lat[$F8]:='\degrees ';
  474.    char_set[$F9]:=$06;  char_code[$F9]:=$1F;  ext_lat[$F9]:='~';
  475.    char_set[$FA]:=$06;  char_code[$FA]:=$20;  ext_lat[$FA]:='~';
  476.    char_set[$FB]:=$07;  char_code[$FB]:=$04;  ext_lat[$FB]:='$\surd$';
  477.    char_set[$FC]:=$04;  char_code[$FC]:=$15;  ext_lat[$FC]:='$^{n}$';
  478.    char_set[$FD]:=$04;  char_code[$FD]:=$14;  ext_lat[$FD]:='$^{2}$';
  479.    char_set[$FE]:=$04;  char_code[$FE]:=$02;  ext_lat[$FE]:='~';
  480. End;
  481.  
  482.  
  483. Procedure Make_tabelentry_attr;
  484. Var
  485.    b,
  486.    num_of_attr : Byte;
  487.    j : Integer;
  488.  
  489. Begin
  490.    num_of_attr := openptr[depth];
  491.    Write(tabel,num_of_attr);
  492.  
  493.    For j:=1 to num_of_attr
  494.    Do Write(tabel,attr_rij[depth,j]);
  495.  
  496. End;
  497.  
  498.  
  499.  
  500. Procedure Make_tabelentry_tabset;
  501. Var
  502.    b : Byte;
  503.    j : Integer;
  504.  
  505. Begin
  506.    b := ord('S');
  507.    Write(tabel,b);
  508.  
  509.    b:=num_of_tabs;
  510.    Write(tabel,b);
  511.  
  512.    For j:=1 to num_of_tabs
  513.    Do Wr_word(tabel,tabpos[j]);
  514. End;
  515.  
  516.  
  517. Procedure Make_tabelentry_rightjustification;
  518. Var
  519.    b : Byte;
  520.  
  521. Begin
  522.    b := Ord('U');
  523.    Write(tabel,b);
  524.  
  525.    If by=$81
  526.    Then b:=01                            { regels WEL uitvullen }
  527.    Else b:=00;                           { regels NIET uitvullen }
  528.    Write(tabel,b);
  529. End;
  530.  
  531.  
  532.  
  533.  
  534. Procedure Make_tabelentry_envir_extra_end;
  535. Var
  536.    b : Byte;
  537.  
  538. Begin
  539.  
  540.    Case envir of
  541.       'C' : Begin
  542.                b:=ord('C');
  543.                Write(tabel,b);
  544.             End;
  545.  
  546.       'T' : Begin
  547.                b:=ord('T');
  548.                Write(tabel,b);
  549.             End;
  550.  
  551.       'I' : Begin
  552.                b:=ord('I');
  553.                Write(tabel,b);
  554.                Wr_word(tabel,ind_leftmargin);
  555.                Wr_word(tabel,ind_rightmargin);
  556.  
  557.                If ind_text2
  558.                Then Begin
  559.                        b:=01;
  560.                        Write(tabel,b)
  561.                     End
  562.                Else Begin
  563.                        b:=00;
  564.                        Write(tabel,b)
  565.                     End;
  566.  
  567.             End;
  568.  
  569.    End;  {Case}
  570.  
  571.    b := Ord(line_term);
  572.    write(tabel,b);
  573.  
  574.    b:=$FF;
  575.    Write(tabel,b);
  576.  
  577. End;
  578.  
  579.  
  580. Procedure Reset_attr_rij(d : Integer);
  581. Var
  582.    j : Integer;
  583.  
  584. Begin
  585.    For j:=0 to 16
  586.    Do attr_rij[d,j]:=$00;
  587.    leegptr[d]:=1;
  588.    openptr[d]:=0;
  589. End;
  590.  
  591.  
  592.  
  593. Procedure Open_all_attr;
  594. { -- Open alle commando's door de Attributen-rij af te lopen -- }
  595.  
  596. Var j:Integer;
  597. Begin
  598.   For j:=(openptr[depth]+1) to (leegptr[depth]-1)
  599.   Do Begin
  600.          Write(strip,Open_com[attr_rij[depth,j]]);
  601.          openptr[depth]:=openptr[depth]+1;
  602.       End;
  603.  
  604.   open_attr_rij[depth]:=False            { Alle attributen staan weer goed }
  605. End;
  606.  
  607.  
  608.  
  609. Procedure Close_all_attr;
  610. { -- Sluit alle commando's door de Attributen-rij af te lopen -- }
  611. Var j:Integer;
  612. Begin
  613.   For j:=openptr[depth] Downto 1
  614.   Do Begin
  615.         Write(strip,Close_com[attr_rij[depth,j]]);
  616.         openptr[depth]:=openptr[depth]-1;
  617.      End;
  618.   open_attr_rij[depth] := True;
  619. End;
  620.  
  621.  
  622.  
  623. Procedure Attr_ON;
  624. { Deze procedure plaatst een attribuut (lettertype) in de attribuut-rij }
  625.  
  626. Var
  627.    b : Byte;
  628.  
  629. Begin
  630.    Read(wpd,b);                             { lees attribuut-code }
  631.  
  632.    attr_rij[depth,leegptr[depth]]:=b;       { attribuut in attr-rij }
  633.    leegptr[depth]:=leegptr[depth]+1;        { plaats 1 verder. }
  634.    open_attr_rij[depth]:=True;              { openstaande attr-rij }
  635.  
  636.    Read(wpd,b);                             { lees voorbij afsluitcode }
  637. End;
  638.  
  639.  
  640.  
  641. Procedure Attr_OFF;
  642. { Deze procedure haalt een uit een attribuut (lettertype) uit de }
  643. { attribuut-rij door middel van een stack principe omdat binnen  }
  644. { LaTeX de later geopende kommando's eerst afgesloten te worden  }
  645.  
  646. Var
  647.    b       : Byte;
  648.    found   : Boolean;
  649.    j,
  650.    codeptr : Integer;
  651.  
  652. Begin
  653.    Read(wpd,b);                             { lees attribuut-code }
  654.  
  655.    j:=leegptr[depth];                       { zoek vanaf top attr-rij }
  656.    found:=False;                            { nog niet gevonden }
  657.  
  658.    While (j>1) and (Not found)              { zoek attr-code in attr-rij }
  659.    Do Begin
  660.         j:=j-1;
  661.         found:=(attr_rij[depth,j]=b)
  662.       End;
  663.  
  664.    If j<=0 Then RunError($0100);            { Moet nooit kunnen voorkomen }
  665.    codeptr:=j;                              { plaats van attr-code in rij }
  666.  
  667. { Sluit alle commando's t/m de desbetreffende code als deze nog niet }
  668. { gesloten zijn.                                                     }
  669.  
  670.    If codeptr<=openptr[depth]
  671.    Then Begin
  672.            For j:=openptr[depth] downto codeptr
  673.            Do Begin
  674.                  Write(strip,Close_com[attr_rij[depth,j]]);
  675.                  openptr[depth]:=openptr[depth]-1;
  676.               End;
  677.         End;
  678.  
  679. { Haal de desbetreffende attribuut uit de rij en werk pointers bij }
  680.  
  681.    For j:=codeptr to (leegptr[depth]-1)
  682.    Do attr_rij[depth,j]:=attr_rij[depth,j+1];
  683.    leegptr[depth]:=leegptr[depth]-1;
  684.  
  685.    open_attr_rij[depth]:=True;                { openstaande attr-rij }
  686.  
  687.    Read(wpd,b);                               { lees voorbij afsluitcode }
  688. End;
  689.  
  690.  
  691.  
  692. Procedure Center;
  693. { Deze procedure zorgt voor center environment zolang er nog geen }
  694. { andere environment is begonnen.                                 }
  695.  
  696. Begin
  697.    If envir=' '
  698.    Then envir:='C';                    { environment = center }
  699.  
  700.    Jump_in_file(wpd,7);                { rest van code overslaan }
  701. End;
  702.  
  703.  
  704.  
  705. Procedure End_Align;
  706. Begin
  707.    If align_tab
  708.    Then Begin
  709.            Close_all_attr;
  710.            Write(strip,'\''');
  711.            align_tab := False;
  712.            Open_all_attr;
  713.         End;
  714.  
  715.    If right_tab
  716.    Then Begin
  717.            Close_all_attr;
  718.            Write(strip,'\''');
  719.            right_tab := False;
  720.            Open_all_attr;
  721.         End;
  722.  
  723.    If center_tab
  724.    Then Begin
  725.            Close_all_attr;
  726.            Write(strip,'}');
  727.            center_tab := False;
  728.            Open_all_attr;
  729.         End;
  730. End;
  731.  
  732.  
  733.  
  734. Procedure Tab;
  735. Var
  736.    j : integer;
  737.    wpu : word;
  738.    tabnum,
  739.    new_tabs : Integer;
  740.  
  741. Begin
  742.    If (envir<>'I') and Not Nomore_valid_tabs      { Noggeen indent --> normaal tab }
  743.    Then Begin
  744.            If by=$48
  745.            Then right_tab := True;
  746.  
  747.            If by=$40
  748.            Then align_tab := True;
  749.  
  750.            If by=$C8
  751.            Then center_tab := True;
  752.  
  753.            Jump_in_file(wpd,2);
  754.  
  755.            Rd_word(wpd,wpu);                       { Lees abs.-indent [wpu] }
  756.            wpu := wpu - WP_sidemargin;             { Correctie ivm WP kantlijn }
  757.  
  758.            tabnum:=0;
  759.            For j:=1 to num_of_tabs                 { Bepaal welke tabpos }
  760.            Do If wpu>=tabpos[j]
  761.               Then tabnum:=j;
  762.  
  763.            new_tabs := tabnum - latex_tabpos;
  764.  
  765.            If new_tabs>0
  766.            Then Begin
  767.                    Close_all_attr;
  768.  
  769.                    For j:=1 to new_tabs
  770.                    Do Write(strip,'\>');
  771.  
  772.                    If center_tab
  773.                    Then Write(strip,'\ctab{');
  774.  
  775.                    Open_all_attr;
  776.                 End;
  777.  
  778.            latex_tabpos:=tabnum;
  779.  
  780.            Jump_in_file(wpd,3);
  781.  
  782.            envir:='T';                              { Er zit een tab in deze regel }
  783.         End
  784.  
  785.    Else Jump_in_file(wpd,7);
  786.  
  787. End;
  788.  
  789.  
  790.  
  791. Procedure Flush_right_tab;
  792. Begin
  793.    If envir<>'I'
  794.    Then Begin
  795.            Close_all_attr;
  796.            Write(strip,'\`');
  797.            Open_all_attr;
  798.  
  799.            Nomore_valid_tabs := True;
  800.  
  801.            envir:='T';
  802.         End;
  803.  
  804.    Jump_in_file(wpd,7);
  805. End;
  806.  
  807.  
  808.  
  809. Procedure Indent;
  810. Var
  811.    dif,
  812.    abs        : Word;
  813.    b          : Byte;
  814.  
  815. Begin
  816.    If envir<>'T'
  817.    Then Begin       {Al een tabcommando gezet dus er mag geen insp }
  818.            Envir:='I';
  819.            indenting:=True;
  820.  
  821.            If Not ind_text2
  822.            Then Begin
  823.                    Read(wpd,b);
  824.                    b:=b And $01;
  825.  
  826.                    Rd_word(wpd,dif);
  827.                    Rd_word(wpd,abs); { Eigenlijk Old current column }
  828.                    Rd_word(wpd,abs);
  829.  
  830.                    ind_leftmargin:=abs-WP_sidemargin;
  831.  
  832.                    If b=1
  833.                    Then ind_rightmargin:=ind_rightmargin+dif;
  834.                    {Margins bepaald lees voorby rest van functie-codes }
  835.                    Jump_in_file(wpd,3);
  836.  
  837.                    If Not ind_text1
  838.                    Then Begin
  839.                            If char_on_line
  840.                            Then Begin
  841.                                    Write(strip,'}');
  842.                                    ind_text1:=True;
  843.                                 End;
  844.                          End;
  845.                  End
  846.            Else Jump_in_file(wpd,10);
  847.         End
  848.    Else Jump_in_file(wpd,10);
  849. End;
  850.  
  851.  
  852. Procedure End_of_indent;
  853. Begin
  854.    indent_end := True;
  855.    Jump_in_file(wpd,5);
  856. End;
  857.  
  858.  
  859.  
  860. Procedure Tabset;
  861. Var
  862.    j           : Integer;
  863.    w           : Word;
  864.    b           : Byte;
  865.  
  866. Begin
  867.    Jump_in_file(wpd,102);        { Ga naar TAB-info }
  868.  
  869.    num_of_tabs:=0;
  870.  
  871.    For j:=1 to 40
  872.    Do Begin
  873.          Rd_word(wpd,w);
  874.          If (w>WP_sidemargin) and (w<>$FFFF)
  875.          Then Begin
  876.                  num_of_tabs:=num_of_tabs+1;
  877.                  tabpos[num_of_tabs] := w - WP_sidemargin;
  878.               End;
  879.       End;
  880.  
  881.    Jump_in_file(wpd,24);
  882.  
  883.    Make_tabelentry_tabset;
  884. End;
  885.  
  886.  
  887.  
  888. Procedure Page_number_position;
  889. Var
  890.    position_code : Byte;
  891.  
  892. Begin
  893.    Jump_in_file(wpd,5);            {Skip length of code; always 10}
  894.                                    { + old information }
  895.    Read(wpd,position_code);
  896.  
  897.    Write(strip,'\pagenumpos');
  898.    Case position_code of
  899.      $01 : Write(strip,'{\pntl}');
  900.      $02 : Write(strip,'{\pntc}');
  901.      $03 : Write(strip,'{\pntr}');
  902.      $05 : Write(strip,'{\pnbl}');
  903.      $06 : Write(strip,'{\pnbc}');
  904.      $07 : Write(strip,'{\pnbr}');
  905.      Else  Write(strip,'{\pnno}');
  906.    End;
  907.  
  908.    Jump_in_file(wpd,6);
  909. End;
  910.  
  911.  
  912.  
  913. Procedure Character;
  914. Var
  915.    ch          : String;
  916.  
  917.    j           : Integer;
  918.    chr_code,
  919.    chr_set,
  920.    b           : Byte;
  921.    found       : Boolean;
  922.  
  923.  
  924. Begin
  925.    If open_attr_rij[depth]
  926.    Then Open_all_attr;
  927.  
  928.    Case by of
  929.       $20..$7F : { Normal_char  }
  930.                  Begin
  931.                     ch := lat[by];
  932.                  End;
  933.  
  934.       $A9      : { Special_char }
  935.                  Begin
  936.                     If by=$A9
  937.                     Then ch:='-'
  938.                     Else ch:='\ ';
  939.                  End;
  940.  
  941.       $C0      : { Extended_char }
  942.                  Begin
  943.                     j:=127;
  944.                     found:=false;
  945.  
  946.                     Read(wpd,chr_code);
  947.                     Read(wpd,chr_set);
  948.  
  949.                     While (j<254) and not found
  950.                     Do Begin
  951.                           j:=j+1;
  952.                           If (chr_code=char_code[j]) and (chr_set=char_set[j])
  953.                           Then found:=True;
  954.                        End;
  955.  
  956.                     If found
  957.                     Then ch:=ext_lat[j]
  958.                     Else ch:='\ ';
  959.  
  960.                     Read(wpd,b);
  961.                  End;
  962.  
  963.       End;
  964.  
  965.    Write(strip,ch);
  966.  
  967. End;
  968.  
  969.  
  970.  
  971. Procedure Return_Page;
  972. Var
  973.    j :Integer;
  974.    ond : Boolean;
  975.  
  976. Begin
  977.  
  978.    Case by of
  979.     $0A,$8C : line_term := 'R';     { Hard return }
  980.       $0D   : line_term := 'r';     { Soft return }
  981.       $0C   : line_term := 'P';     { Hard page }
  982.       $0B   : line_term := 'p';     { Soft page }
  983.    End;
  984.  
  985.    Writeln(strip);
  986.  
  987.    Make_Tabelentry_envir_extra_end;
  988.  
  989.    If indent_end
  990.    Then Begin
  991.            envir:=' ';
  992.            indenting:=False;
  993.            ind_text1:=False;
  994.            ind_text2:=False;
  995.            ind_leftmargin:=0;
  996.            ind_rightmargin:=0;
  997.  
  998.            indent_end:=False;
  999.         End
  1000.  
  1001.    Else If envir<>'I'
  1002.         Then envir:=' ';
  1003.  
  1004.    char_on_line:=False;
  1005.    nomore_valid_tabs := False;
  1006.  
  1007.    regelnum:=regelnum+1;
  1008.  
  1009.    Make_tabelentry_attr;
  1010.  
  1011.    latex_tabpos:=0;
  1012. End;
  1013.  
  1014.  
  1015. Procedure Nop80;
  1016. Begin
  1017.    { Om dat het een 1-byte funktie is hoeft er niks overgeslagen }
  1018.    { te worden.                                                  }
  1019. End;
  1020.  
  1021.  
  1022.  
  1023. Procedure NopC0;
  1024. Begin
  1025.    If by=$C0 Then Jump_in_file(wpd,3);
  1026.    If by=$C1 Then Jump_in_file(wpd,8);
  1027.    If by=$C2 Then Jump_in_file(wpd,10);
  1028.    If by=$C3 Then Jump_in_file(wpd,2);
  1029.    If by=$C4 Then Jump_in_file(wpd,2);
  1030.    If by=$C5 Then Jump_in_file(wpd,4);
  1031.    If by=$C6 Then Jump_in_file(wpd,5);
  1032.    If by=$C7 Then Jump_in_file(wpd,6);
  1033. End;
  1034.  
  1035.  
  1036.  
  1037. Procedure NopD0(already_read_subfunc_code : Boolean);
  1038. Var
  1039.    b : Byte;
  1040.    w : Word;
  1041.  
  1042. Begin
  1043.    If Not already_read_subfunc_code
  1044.    Then Read(wpd,b);      { Lees subfunctioncode }
  1045.  
  1046.    Rd_word(wpd,w);       { Lees lengte 'die nog volgt ' }
  1047.    Seek(wpd,filepos(wpd)+w);
  1048. End;
  1049.  
  1050.  
  1051.  
  1052. Procedure Overstrike;
  1053.  
  1054. Var
  1055.    first_char_os    : Boolean;
  1056.  
  1057.    char_width_os,
  1058.    len_of_code      : Word;
  1059.    end_of_code      : LongInt;
  1060.  
  1061. Begin
  1062.    Rd_word(wpd,len_of_code);             { Lees lengte }
  1063.    end_of_code := filepos(wpd) + len_of_code - 4;
  1064.  
  1065.    Rd_word(wpd,char_width_os);
  1066.  
  1067.    first_char_os := True;
  1068.  
  1069.    While FilePos(wpd) < end_of_code
  1070.    Do Begin
  1071.          Read(wpd,by);
  1072.  
  1073.          Case by of
  1074.            $20..$7F,
  1075.            $A9,$C0  : If first_char_os
  1076.                       Then Begin
  1077.                               Character;
  1078.                               first_char_os := False;
  1079.                            End
  1080.                       Else Begin
  1081.                               Write(strip,'\llap{');
  1082.                               Character;
  1083.                               Write(strip,'}');
  1084.                            End;
  1085.  
  1086.            $00..$BF : Nop80;
  1087.            $C0..$CF : NopC0;
  1088.            $D0..$FE : NopD0(False);
  1089.          End;
  1090.  
  1091.       End;
  1092.  
  1093.    Jump_in_file(wpd,4);
  1094.  
  1095. End;
  1096.  
  1097.  
  1098.  
  1099. Procedure Footnote;
  1100. Var
  1101.    flags,
  1102.    num_of_pages     : Byte;
  1103.  
  1104.    fn_num,
  1105.    len_of_code      : Word;
  1106.    end_of_code      : LongInt;
  1107.  
  1108. Begin
  1109.    Rd_word(wpd,len_of_code);             { Lees lengte }
  1110.    end_of_code := filepos(wpd) + len_of_code - 4;
  1111.  
  1112.    Read(wpd,flags);
  1113.  
  1114.    Rd_word(wpd,fn_num);
  1115.  
  1116. { Skip all the shit }
  1117.  
  1118.    Read(wpd,num_of_pages);
  1119.    Jump_in_file(wpd,2*(num_of_pages+1)+9);
  1120.  
  1121.    Close_all_attr;
  1122.  
  1123.    depth := 1;
  1124.    Reset_attr_rij(depth);
  1125.  
  1126.    Write(strip,'\footnote[',fn_num:1,']{');
  1127.  
  1128.    While FilePos(wpd) < end_of_code
  1129.    Do Begin
  1130.          Read(wpd,by);
  1131.  
  1132.          Case by of
  1133.            $20..$7F,
  1134.            $A9,$C0  : Character;
  1135.  
  1136.            $0A,$0C  : Write(strip,'\\ ');
  1137.  
  1138.            $0B,$0D  : Write(strip,' ');
  1139.  
  1140.             $C3     : Attr_ON;
  1141.  
  1142.             $C4     : Attr_OFF;
  1143.  
  1144.            $00..$BF : Nop80;
  1145.            $C0..$CF : NopC0;
  1146.            $D0..$FE : NopD0(False);
  1147.          End;
  1148.  
  1149.       End;
  1150.  
  1151.    Close_all_attr;      { Echt nodig ? }
  1152.    Write(strip,'}');
  1153.  
  1154.    Jump_in_file(wpd,4);
  1155.  
  1156.    depth := 0;
  1157.    Open_all_attr;
  1158.  
  1159. End;
  1160.  
  1161.  
  1162.  
  1163. Procedure Header_Footer;
  1164. Var
  1165.    subfunc,
  1166.    occurance : Byte;
  1167.    len_of_code : Word;
  1168.    end_of_code : LongInt;
  1169.  
  1170.    hf_left,
  1171.    hf_center,
  1172.    hf_right  : Boolean;
  1173.  
  1174.    j : Integer;
  1175.  
  1176. Begin
  1177.    Read(wpd,subfunc);
  1178.    Rd_word(wpd,len_of_code);
  1179.  
  1180.    If len_of_code > 22
  1181.    Then Begin
  1182.            end_of_code := FilePos(wpd) + len_of_code - 4;
  1183.  
  1184.            Jump_in_file(wpd,7);
  1185.  
  1186.            Read(wpd,occurance);
  1187.  
  1188.            Jump_in_file(wpd,10);
  1189.  
  1190.            Close_all_attr;
  1191.            depth := 1;
  1192.  
  1193. { Geen schone attr._lei; Kopieer attributen uit Niveau 0;  Fout in WP 5.0 ? }
  1194.  
  1195.            For j:=0 to 15
  1196.            Do attr_rij[1,j] := attr_rij[0,j];
  1197.  
  1198.            leegptr[1]:=leegptr[0];
  1199.            openptr[1]:=openptr[0];
  1200.  
  1201.            Case subfunc of
  1202.              00,01 : Write(strip,'\headtext');
  1203.              02,03 : Write(strip,'\foottext');
  1204.            End;
  1205.  
  1206.            Case occurance of
  1207.              00 : Write(strip,'{\neverpages}{');
  1208.              01 : Write(strip,'{\allpages}{');
  1209.              02 : Write(strip,'{\oddpages}{');
  1210.              03 : Write(strip,'{\evenpages}{');
  1211.            End;
  1212.  
  1213.            Open_all_attr;
  1214.            hf_left   := True;           { Beginnen met de linkerkant }
  1215.            hf_center := False;
  1216.            hf_right  := False;
  1217.  
  1218.            While FilePos(wpd) < end_of_code
  1219.            Do Begin
  1220.                  Read(wpd,by);
  1221.  
  1222.                  Case by of
  1223.                    $20..$7F,
  1224.                    $A9,$C0  : Character;
  1225.  
  1226.  
  1227.                      $C1    : Begin
  1228.                                  Read(wpd,by);
  1229.                                  by := by and $E0;
  1230.                                  Jump_in_file(wpd,7);
  1231.  
  1232.                                  If by=$E0
  1233.                                  Then Begin
  1234.                                          If hf_left
  1235.                                          Then Begin
  1236.                                                  Close_all_attr;
  1237.                                                  Write(strip,'}{');
  1238.                                                  Open_all_attr;
  1239.  
  1240.                                                  hf_left   := False;
  1241.                                                  hf_center := True;
  1242.                                               End;
  1243.                                       End;
  1244.  
  1245.                                  If by=$60
  1246.                                  Then Begin
  1247.                                          If hf_left
  1248.                                          Then Begin
  1249.                                                  Close_all_attr;
  1250.                                                  Write(strip,'}{}{');
  1251.                                                  Open_all_attr;
  1252.  
  1253.                                                  hf_left  := False;
  1254.                                                  hf_right := True;
  1255.                                               End;
  1256.  
  1257.                                          If hf_center
  1258.                                          Then Begin
  1259.                                                  Close_all_attr;
  1260.                                                  Write(strip,'}{');
  1261.                                                  Open_all_attr;
  1262.  
  1263.                                                  hf_center := False;
  1264.                                                  hf_right  := True;
  1265.                                               End;
  1266.                                       End;
  1267.                               End;
  1268.  
  1269.                      $C3    : Attr_ON;
  1270.  
  1271.                      $C4    : Attr_OFF;
  1272.  
  1273.                    $00..$BF : Nop80;
  1274.                    $C0..$CF : NopC0;
  1275.                    $D0..$FE : NopD0(False);
  1276.  
  1277.                  End;
  1278.               End;
  1279.  
  1280.            Close_all_attr;      { Echt nodig ? }
  1281.  
  1282.            Jump_in_file(wpd,4);
  1283.  
  1284.            If hf_left   Then Write(strip,'}{}{}');
  1285.            If hf_center Then Write(strip,'}{}');
  1286.            If hf_right  Then Write(strip,'}');
  1287.  
  1288.            depth := 0;
  1289.            Open_all_attr;
  1290.  
  1291.         End
  1292.  
  1293.    Else Jump_in_file(wpd,len_of_code);
  1294.  
  1295. End;
  1296.  
  1297.  
  1298. Begin
  1299.    Table_Init;
  1300.    Ext_chr_init;
  1301.  
  1302.    Reset_attr_rij(0);
  1303.    Reset_attr_rij(1);
  1304.    depth := 0;
  1305.  
  1306.    WP_default;
  1307.  
  1308.    latex_tabpos:=0;
  1309.    right_tab := False;
  1310.    align_tab := False;
  1311.    center_tab := False;
  1312.  
  1313.    indenting:=False;
  1314.    indent_end:=False;
  1315.    ind_text1:=False;
  1316.    ind_text2:=False;
  1317.    ind_leftmargin:=0;
  1318.    ind_rightmargin:=0;
  1319.  
  1320.    envir:=' ';
  1321.  
  1322.    nomore_valid_tabs := False;
  1323.  
  1324.    Writeln('First strike :');
  1325.    Write('Converting-percentage :     ');
  1326.  
  1327.    srtdocpos:=filepos(wpd);
  1328.    fsize:=FileSize(wpd);
  1329.  
  1330.    regelnum := 0;
  1331.  
  1332.    Make_tabelentry_attr;           { attribuut instelling }
  1333.  
  1334.    Make_tabelentry_tabset;         { Geef de defaulttabinstelling door }
  1335.                                    { aan de 2e slag }
  1336.  
  1337.   
  1338.  
  1339.    While (FilePos(wpd)<fsize)
  1340.    Do Begin
  1341.         convperc:=round((FilePos(wpd)-srtdocpos)/(fsize-srtdocpos)*100);
  1342.         Write(chr(8),chr(8),chr(8),chr(8),convperc:3,'%');
  1343.  
  1344.         Read(wpd,by);
  1345.  
  1346.         Case by of
  1347.           $20..$7F,
  1348.           $A9,$C0  : Begin
  1349.                          char_on_line:=True;            {Er (al) is een karakter op deze regel }
  1350.                          If indenting                   {Als er is ingeprongen er na een stuk }
  1351.                          Then If ind_text1              {tekst is weer ingesprongen (ind_text1) }
  1352.                               Then ind_text2:=True;     {dan hoort dit char bij het ind_txt-blok }
  1353.  
  1354.                          Character;
  1355.                       End;
  1356.  
  1357.           $0A,$0D,
  1358.           $0B,$0C,
  1359.           $8C      : Return_Page;
  1360.  
  1361.           $C1      : Begin
  1362.                         Read(wpd,by);
  1363.                         by:=by and $E8;
  1364.  
  1365.                         Case by of
  1366.                           $00,$C8,
  1367.                           $48,$40     : Tab;
  1368.                           $60         : Flush_right_tab;
  1369.                           $E0         : Center;
  1370.                           Else          Jump_in_file(wpd,7);
  1371.                         End;
  1372.                      End;
  1373.           $81,$82  : Make_tabelentry_rightjustification;
  1374.           $83      : End_Align;
  1375.           $C3      : Attr_ON;
  1376.           $C4      : Attr_OFF;
  1377.           $C2      : Indent;
  1378.           $C6      : End_of_indent;
  1379.           $C5,$C7  : NopC0;
  1380.  
  1381.           $D0      : Begin
  1382.                         Read(wpd,by);
  1383.                         Case by of
  1384.                           $04 : Tabset;
  1385.                           $08 : Page_number_position;
  1386.                           Else  NopD0(True);
  1387.                         End;
  1388.                      End;
  1389.  
  1390.           $D5      : Header_Footer;
  1391.  
  1392.           $D6      : Begin
  1393.                         Read(wpd,by);
  1394.                         Case by of
  1395.                           $00 : Footnote;
  1396.                           Else NopD0(True);
  1397.                         End;
  1398.                      End;
  1399.  
  1400.           $D8      : Begin
  1401.                         Read(wpd,by);
  1402.                         Case by of
  1403.                           $02 : Overstrike;
  1404.                           Else NopD0(True);
  1405.                         End;
  1406.                      End;
  1407.  
  1408.           $00..$1F,
  1409.           $80..$BF : Nop80;
  1410.  
  1411.           $D0..$FF : NopD0(False);
  1412.  
  1413.         End;
  1414.       End;
  1415.  
  1416.    Writeln;
  1417.    Make_tabelentry_envir_extra_end;
  1418.  
  1419.    num_of_lines_stripfile := regelnum;
  1420.  
  1421. End;
  1422.  
  1423.  
  1424. {---SLAG2---}
  1425.  
  1426. Procedure Convert_second_strike;
  1427. Var
  1428.    regelnum : Word;
  1429.    convperc : Integer;
  1430.  
  1431.    underline,
  1432.    illegal_argument,
  1433.    just_envir_closed      : Boolean;
  1434.  
  1435.    i     : Integer;
  1436.  
  1437.    regel,
  1438.    hulp_regel            : String;
  1439.    len_reg               : Integer;
  1440.  
  1441.    num_of_tabs           : Integer;
  1442.    tabpos                : Array [1..40] of Word;
  1443.  
  1444.    tabent_num_of_tabs    : Array [0..2] of Integer;
  1445.    tabent_tabpos         : Array [0..2,1..40] of Word;
  1446.  
  1447.    ind_leftmargin,
  1448.    ind_rightmargin       : Array [0..2] of Word;
  1449.    ind_label             : Array [0..2] of Byte;
  1450.  
  1451.    pre,
  1452.    cur,
  1453.    next     : Integer;
  1454.  
  1455.    envir,
  1456.    line_term  : Array [0..2] of Char;
  1457.    new_tabset : Array [0..2] of Boolean;
  1458.  
  1459.    rightjust,
  1460.    new_rightjust         : Boolean;
  1461.    new_tabent_rightjust,
  1462.    tabent_rightjust      : Array [0..2] of Boolean;
  1463.  
  1464.    num_of_attr : Array[0..2] of Integer;
  1465.    attr_BOL    : Array[0..2,$00..$10] of Byte;
  1466.    attr_closed : Boolean;
  1467.  
  1468.  
  1469.  
  1470. Procedure Read_tabelentry(n:Integer);
  1471. Var
  1472.    w  : Word;
  1473.    b  : Byte;
  1474.    j  : Integer;
  1475.  
  1476. Begin
  1477.    { Begin met een schone lei die dan door deze procedure verder wordt }
  1478.    { opgevuld. }
  1479.  
  1480.    envir[n]:=' ';
  1481.    new_tabset[n]:=False;
  1482.    new_tabent_rightjust[n]:=False;
  1483.  
  1484.    num_of_attr[n] := 0;
  1485.    For j:=1 to 16
  1486.    Do attr_BOL[n,j]:=0;
  1487.  
  1488.    If filepos(tabel)<filesize(tabel)
  1489.    Then Begin
  1490.  
  1491.            Read(tabel,b);
  1492.            num_of_attr[n] := b;
  1493.            For j:=1 to num_of_attr[n]
  1494.            Do Read(tabel,Attr_BOL[n,j]);
  1495.  
  1496.            b:=$00;
  1497.            While b<>$FF
  1498.            Do Begin
  1499.                  Read(tabel,b);
  1500.  
  1501.                  Case chr(b) Of
  1502.                    'C' : envir[n]:='C';
  1503.                    'T' : envir[n]:='T';
  1504.                    'I' : Begin
  1505.                             envir[n]:='I';
  1506.                             Rd_word(tabel,ind_leftmargin[n]);
  1507.                             Rd_word(tabel,ind_rightmargin[n]);
  1508.                             Read(tabel,ind_label[n]);
  1509.                          End;
  1510.  
  1511.                    'S' : Begin
  1512.                             new_tabset[n]:=True;
  1513.                             Read(tabel,b);
  1514.                             tabent_num_of_tabs[n]:=b;
  1515.  
  1516.                             For j:=1 to tabent_num_of_tabs[n]
  1517.                             Do Begin
  1518.                                   Rd_word(tabel,w);
  1519.                                   tabent_tabpos[n,j]:=w;
  1520.                                End;
  1521.                          End;
  1522.  
  1523.                    'U' : Begin
  1524.                             new_tabent_rightjust[n]:=True;
  1525.                             Read(tabel,b);
  1526.                             If b=0
  1527.                             Then tabent_rightjust[n]:=False
  1528.                             Else tabent_rightjust[n]:=True;
  1529.                          End;
  1530.  
  1531.                    'R','r','P','p' : line_term[n]:=chr(b);
  1532.  
  1533.                 End {Case};
  1534.               End;
  1535.         End
  1536.  
  1537. { Er is geen volgende tabelentry dus ook geen volgende regel }
  1538. { De tabelentry is 'schoon'.                                 }
  1539. { Zodat het document 'schoon' wordt afgesloten.              }
  1540.  
  1541. End;
  1542.  
  1543.  
  1544.  
  1545. Procedure Open_all_attr_BOL;
  1546. { -- Open alle commando's door de Attributen-rij af te lopen -- }
  1547. Var
  1548.    j:Integer;
  1549. Begin
  1550.    For j:=$01 to num_of_attr[cur]
  1551.    Do Write(latex,Open_com[attr_BOL[cur,j]]);
  1552.  
  1553.    attr_closed := False;
  1554. End;
  1555.  
  1556.  
  1557. Procedure Close_all_attr_BOL;
  1558. { -- Sluit alle commando's door de Attributen-rij af te lopen -- }
  1559. Var
  1560.    j:Integer;
  1561. Begin
  1562.    For j:=num_of_attr[cur] Downto $01
  1563.    Do Write(latex,Close_com[Attr_BOL[cur,j]]);
  1564.  
  1565.    attr_closed := True;
  1566. End;
  1567.  
  1568.  
  1569.  
  1570. Procedure Open_all_attr_EOL;
  1571. { -- Open alle commando's door de Attributen-rij af te lopen -- }
  1572. Var j:Integer;
  1573. Begin
  1574.   For j:=$01 to num_of_attr[next]
  1575.   Do Write(latex,Open_com[Attr_BOL[next,j]]);
  1576.  
  1577.   attr_closed := False;
  1578. End;
  1579.  
  1580.  
  1581.  
  1582. Procedure Close_all_attr_EOL;
  1583. { -- Sluit alle commando's door de Attributen-rij af te lopen -- }
  1584. Var j:Integer;
  1585. Begin
  1586.   For j:=num_of_attr[next] Downto $01
  1587.   Do Write(latex,Close_com[Attr_BOL[next,j]]);
  1588.  
  1589.   attr_closed := True;
  1590. End;
  1591.  
  1592.  
  1593.  
  1594. Procedure Latex_head;
  1595. { -- Maak het de standard-heading voor een latex-file aan -- }
  1596. Begin
  1597.   Writeln(latex,'\documentstyle[11pt,wp2latex]{report}');
  1598.   Writeln(latex,'\begin{document}')
  1599. End;
  1600.  
  1601.  
  1602.  
  1603. Procedure Latex_foot;
  1604. { -- Sluit de latex-file op de juiste wijze af -- }
  1605. Begin
  1606.   Writeln(latex,'\end{document}')
  1607. End;
  1608.  
  1609.  
  1610.  
  1611. Procedure Latex_tabset;
  1612. Var
  1613.    atpr,j    : Integer;
  1614.    l,ol : Real;
  1615.  
  1616. Begin
  1617.    atpr:=0;                  { Huiding aantal tabs per regel }
  1618.    ol:=0;
  1619.    For j:=1 to num_of_tabs
  1620.    Do Begin
  1621.          l:=tabpos[j]/1200 * 2.54;
  1622.          Write(latex,'\hspace{', l-ol :3:2,'cm}\=');
  1623.          atpr:=atpr+1;
  1624.          If atpr>=4
  1625.          Then Begin
  1626.                  Writeln(latex,'%');
  1627.                  atpr:=0;
  1628.               End;
  1629.          ol:=l;
  1630.       End;
  1631.    Writeln(latex,'\kill');
  1632. End;
  1633.  
  1634.  
  1635.  
  1636. Function Change_envir_BOL : Boolean;
  1637. Var
  1638.    hulp : Boolean;
  1639.  
  1640. Begin
  1641.    hulp := False;
  1642.  
  1643.    hulp := ((envir[cur]='C') And Not (envir[pre]='C')) Or hulp;
  1644.    hulp := ((envir[cur]='T') And Not (envir[pre]='T')) Or hulp;
  1645.    hulp := ((envir[cur]='I') And Not (envir[pre]='I')) Or hulp;
  1646.  
  1647.    change_envir_BOL := hulp;
  1648. End;
  1649.  
  1650.  
  1651.  
  1652. Function Change_envir_EOL : Boolean;
  1653. Var
  1654.    hulp : Boolean;
  1655.  
  1656. Begin
  1657.    hulp := False;
  1658.  
  1659.    hulp := ((envir[next]='C') Xor (envir[cur]='C')) Or hulp;
  1660.    hulp := ((envir[next]='T') Xor (envir[cur]='T')) Or hulp;
  1661.    hulp := ((envir[next]='I') Xor (envir[cur]='I')) Or hulp;
  1662.  
  1663.    change_envir_EOL := hulp;
  1664. End;
  1665.  
  1666.  
  1667.  
  1668.  
  1669. Procedure Open_environment;
  1670.  
  1671. Begin
  1672.    If change_envir_BOL                 { andere environment ? }
  1673.    Then Begin
  1674.            If Not attr_closed
  1675.            Then Close_all_attr_BOL;
  1676.  
  1677.            Case envir[cur] of
  1678.               'C' : Begin
  1679.                        Writeln(latex,'\begin{center}');
  1680.                     End;
  1681.  
  1682.               'T' : Begin
  1683.                        Writeln(latex,'\begin{tabbing}');
  1684.                        Latex_tabset;
  1685.                     End;
  1686.  
  1687.               'I' : Begin
  1688.                        Write(latex,'\begin{indenting}');
  1689.                        Write(latex,'{',ind_leftmargin[cur]/1200*2.54:3:2,'cm}');
  1690.                        Write(latex,'{',ind_rightmargin[cur]/1200*2.54:3:2,'cm}');
  1691.                        If ind_label[cur]=1
  1692.                        Then Begin
  1693.                                Writeln(latex,'%');
  1694.                                Write(latex,'{');
  1695.                             End
  1696.                        Else Writeln(latex,'{}');
  1697.                     End
  1698.            End;
  1699.  
  1700.         End
  1701.  
  1702.    Else If new_tabset[cur] and (envir[cur]='T')
  1703.         Then Latex_tabset;
  1704.  
  1705. End;
  1706.  
  1707.  
  1708.  
  1709. Procedure Close_environment;
  1710.  
  1711. Begin
  1712.  
  1713.            Case envir[cur] of
  1714.               'C' : Begin
  1715.                        Writeln(latex,'\end{center}');
  1716.                     End;
  1717.  
  1718.               'T' : Begin
  1719.                        Writeln(latex,'\end{tabbing}');
  1720.                     End;
  1721.  
  1722.               'I' : Begin
  1723.                        Writeln(latex,'\end{indenting}');
  1724.                     End;
  1725.            End;
  1726.  
  1727.            just_envir_closed := True;
  1728.  
  1729. End;
  1730.  
  1731.  
  1732.  
  1733. Procedure Update_global_information;
  1734. Var
  1735.    j : Integer;
  1736.  
  1737. Begin
  1738.    If new_tabset[cur]
  1739.    Then Begin
  1740.            num_of_tabs:=tabent_num_of_tabs[cur];
  1741.            For j:=1 to num_of_tabs
  1742.            Do tabpos[j]:=tabent_tabpos[cur,j]
  1743.         End;
  1744.  
  1745.    If new_tabent_rightjust[cur]
  1746.    Then new_rightjust := tabent_rightjust[cur];
  1747.  
  1748. End;
  1749.  
  1750.  
  1751. Procedure Change_tabelentry;
  1752. Var
  1753.    help : Integer;
  1754.  
  1755. Begin
  1756.    help:=pre;
  1757.    pre:=cur;
  1758.    cur:=next;
  1759.    next:=help;
  1760.    Read_tabelentry(next);
  1761. End;
  1762.  
  1763.  
  1764. Begin
  1765.    pre:=0;
  1766.    cur:=1;
  1767.    next:=2;
  1768.  
  1769.    envir[pre]:=' ';
  1770.    new_tabset[pre]:=False;
  1771.  
  1772.    just_envir_closed:=True;
  1773.    attr_closed := False;
  1774.  
  1775.    rightjust:=True;
  1776.    new_rightjust:=True;
  1777.    For i:=0 to 2
  1778.    Do Begin
  1779.          new_tabent_rightjust[i]:=False;
  1780.          tabent_rightjust[i]:=False;
  1781.       End;
  1782.  
  1783.    Read_tabelentry(cur);
  1784.    Read_tabelentry(next);
  1785.  
  1786.    regelnum:=1;
  1787.  
  1788.    Writeln;
  1789.    Writeln('Second strike :');
  1790.    Write('Converting-percentage :     ');
  1791.  
  1792.   
  1793.  
  1794.    Latex_head;
  1795.  
  1796.    While (Not Eof(strip)) and (not keypressed)
  1797.    Do Begin
  1798.          Update_global_information;
  1799.  
  1800.          convperc := round(100*regelnum/num_of_lines_stripfile);
  1801.          if convperc>100 then convperc:=100;
  1802.          Write(chr(8),chr(8),chr(8),chr(8),convperc:3,'%');
  1803.  
  1804.          Readln(strip,regel);
  1805.  
  1806. { Werk eventueel de regel bij d.m.v. een hulp regel. }
  1807.  
  1808.          hulp_regel := regel;
  1809.          len_reg := length(hulp_regel);
  1810.  
  1811. { Meerdere spaties achter elkaar vervangen door harde spaties. }
  1812.  
  1813.          For i:=1 to len_reg-1
  1814.          Do If (regel[i]=' ') and (regel[i+1]=' ')
  1815.             Then hulp_regel[i+1]:='~';
  1816.  
  1817. { Zoek naar een illegaal argument en zet hier accolades voor. }
  1818.  
  1819.          If ((len_reg>=1) and (hulp_regel[1]='[')) or
  1820.             ((len_reg>=2) and (hulp_regel[1]=' ') and (hulp_regel[2]='['))
  1821.          Then hulp_regel:='{}' + hulp_regel;
  1822.  
  1823. { De regel is verwerkt. }
  1824.  
  1825.          regel := hulp_regel;
  1826.          len_reg := length(regel);
  1827.  
  1828.          If new_rightjust xor rightjust
  1829.          Then Begin
  1830.                  rightjust := new_rightjust;
  1831.                  If rightjust
  1832.                  Then Writeln(latex,'\justified')
  1833.                  Else Writeln(latex,'\raggedright');
  1834.               End;
  1835.  
  1836.          Open_environment;
  1837.  
  1838.          If len_reg>0
  1839.          Then Begin
  1840.                  If attr_closed
  1841.                  Then Open_all_attr_BOL;
  1842.  
  1843.                  Write(latex,regel);
  1844.  
  1845.                  just_envir_closed := False;
  1846.               End;
  1847.  
  1848.          Case line_term[cur] of
  1849.  
  1850.           'r','p' : Begin
  1851.                        Writeln(latex);
  1852.                        If Change_envir_EOL
  1853.                        Then Begin
  1854.                                If Not attr_closed
  1855.                                Then Close_all_attr_EOL;
  1856.  
  1857.                                Close_environment;
  1858.                             End;
  1859.                     End;
  1860.  
  1861.               'R' : Begin
  1862.  
  1863.                        If envir[cur]='I'
  1864.                        Then Begin
  1865.                                If Not attr_closed
  1866.                                Then Close_all_attr_EOL;
  1867.  
  1868.                                Writeln(latex);
  1869.                                Close_environment;
  1870.                                envir[cur]:=' ';
  1871.                             End
  1872.  
  1873.                        Else Begin
  1874.                                underline:=False;
  1875.                                For i:=$01 to $10
  1876.                                Do underline := underline
  1877.                                                Or (Attr_Bol[next,i]=$B)
  1878.                                                Or (Attr_bol[next,i]=$E);
  1879.  
  1880.                                If underline and Not attr_closed
  1881.                                Then Close_all_attr_EOL;
  1882.  
  1883.                        { Elke Indent-environment moet na een harde Return}
  1884.                        { Afgesloten worden.}
  1885.  
  1886.  
  1887.                                If Change_envir_EOL
  1888.                                Then Begin
  1889.                                        If just_envir_closed
  1890.                                        Then Writeln(latex,'\nwln')
  1891.                                        Else Writeln(latex);
  1892.  
  1893.                                        If Not attr_closed
  1894.                                        Then Close_all_attr_EOL;
  1895.  
  1896.                                        Close_environment;
  1897.                                     End
  1898.                                Else Begin
  1899.                                        If just_envir_closed
  1900.                                        Then Writeln(latex,'\nwln')
  1901.                                        Else Writeln(latex,'\\');
  1902.                                      End;
  1903.                             End;
  1904.                     End;
  1905.  
  1906.               'P' : Begin
  1907.                        If Not attr_closed
  1908.                        Then Close_all_attr_EOL;
  1909.  
  1910.                        Writeln(latex);
  1911.                        Close_environment;
  1912.                        Writeln(latex,'\newpage');
  1913.                        envir[cur]:=' ';
  1914.                     End;
  1915.  
  1916.          End {Case};
  1917.  
  1918.  
  1919.  
  1920.          Change_tabelentry;
  1921.  
  1922.          regelnum:=regelnum+1;
  1923.       End;
  1924.  
  1925.    Latex_foot;
  1926.    Writeln;
  1927. End;
  1928.  
  1929.  
  1930. {---HOOFDPROG---}
  1931.  
  1932.  
  1933. Begin
  1934.    Exitsave:=Exitproc;                { Bewaar de orginele exit-pointer }
  1935.    Exitproc:=@Einde_prog;             { Spring bij Exit naar Proc. Einde_prog }
  1936.  
  1937.    Init_commando;
  1938.  
  1939.    ClrScr;
  1940.    Writeln;
  1941.    Writeln('     Conversionprogram : From Wordperfect 5.0 to LaTeX  (WP2latEX)');
  1942.    Writeln;
  1943.    Writeln('  (c) TUE-Eindhoven ---- Made by R.C.Houtepen ---- Date : 24 Jan 1990');
  1944.  
  1945.    Filenames;
  1946.  
  1947.    Reset(wpd);
  1948.    Wpd_check;
  1949.  
  1950.    Rewrite(strip);
  1951.    Rewrite(tabel);
  1952.  
  1953.    Writeln('Converting ...');
  1954.    Writeln;
  1955.  
  1956.    Convert_first_strike;
  1957.  
  1958.    Close(wpd);
  1959.    Close(strip);
  1960.    Close(tabel);
  1961.  
  1962.    Reset(strip);
  1963.    Reset(tabel);
  1964.    Rewrite(latex);
  1965.  
  1966.    Convert_second_strike;
  1967.  
  1968.    Close(strip);
  1969.    Close(tabel);
  1970.    Close(latex);
  1971.  
  1972.    Erase(strip);
  1973.    Erase(tabel);
  1974.  
  1975. End.
  1976.  
  1977.